perm filename PROB8.ORI[P,JRA] blob sn#203338 filedate 1976-02-23 generic text, type T, neo UTF8
 
;
;
;	THIS IS THE "ORIGINAL" EXTENDED SYNAX LISP EVALUATOR.
;	IT IS REPLACED BY THE CURRENT "PROB8.M11"
;
;
		.SBTTL THE EVALUATOR

;		FORREST W. HOWARD JR.
;		CENTER FOR RESEARCH IN COMPUTING TECHNOLOGY
;		AIKEN COMPUTATION LAB.
;		CAMBRIDGE, MA. 02138
;
;
	
		.RSECT	SHRCODE CON

		;THE EVALUATOR
EVAL:
.IF	DF,NOEVAL	
	.IFT
	 .IF	EQ,NOEVAL-1	;NOEVAL IS DEFINED AS 1 FOR THIS FEATURE
		TSTB	TRACFLG
		BEQ	1$
		PROPUSH A
		NPUSH #ANIL
		CALL	PRINTR
		OUTSTR	LINEFEED
		CALL	DMPPORT
		CMP	-(NP),-(NP)
		UNPROPOP A
1$:
	  .ENDC
	 .ENDC
	TSTB	INTFLG
	BEQ	P832$
	PROPUSH	A
	ERROR	</↑C INTERRUPT/>,31$
31$:	UNPROPOP A
P832$:	DISPATCH		;TTHE REAL CODE
	RET			;A NUMBER--RETURN IT
	.WORD 0
	BR	EDTPR		;A DTPR--BRANCH TO EDTPR FOR IT
	.WORD	0
	BR	EATOM		;AN ATOM--LETS GETS ITS BINDING
	.WORD	0
	RET			;BCD--WHAT ELSE CAN WE DO WITH IT
	.WORD 0
	RET			;SAME GO FOR PORTS
EATOM:	JMPIFTR	A,ERET		;IF TRUE,RETURN IT
	JMPIFNIL A,ERET		;IF NIL,RETURN IT
	CALL	LOOKUP		;OTHERWISE FIND ITS BINDING
	MOV	2(A),A		;AND MOVE IT TO A
ERET:	RET			;THEN GO HOME
EDTPR:	PUSH	A		;MAKE A FN BLOCK--LIKE SO



;	SNAG(EEXIT)
;	FUNCTION
;	PTR TO NP
;	FORM
;	REAL RETURN



	PUSH	NP
	PUSH	(A)
	PUSH	#EEXIT
	CAR	A,A		;LETS SEE WHAT CAR OF A HAS FOR US
EVFL:	DISPATCH		;CAN BE ANYTHING
	 BR	EVERROR		;NUMBERS MAKE BAD FUNCTIONS
	.WORD	0
	JMP	EVDTPR		;IF A DTPR, LETS SEE WHAT IT LOOKS LIKE
	 BR	EVATOM		;IF AN ATOM, GO TO GET ITS FUNCTION BINDING
	.WORD	0
	 BR	EVBCD		;IF ITS BCD, THEN GO TO CODE THAA KNOWS
	.WORD	0		;WHAT DO DO WITH IT
EVERROR:ERROR	</BAD FUNCTION/>,EVFL		;GIVE THE POOR USER A CHANCE TO SUPPLY
				; A NEW FUNCTION

EVATOM:	JMPIFNIL A,EVERROR		;NIL ALSO MAKES A PRETTY
					; MISSERABLE FUNCTION
	JMPIFNIL 4(A),EVASEARCH		;IF THE FUNCTION BINDING IS NIL,
					; THEN GET CURRENT BINDING
	MOV	4(A),A			;THE FNB WAS NON-NIL--LETS SEE
					; WHAT IS
	CMPTYPE	A,J1,#NDTPR		;IS IT A DTPR?
	BNE	EVFL			;I.E. GO IF NOT DTPR		;
	CAR	A,J1			;GETS ITS CAR--SHOULD BE
					; LAMBDA OR NLAMBDA
	CMP	J1,#ALAMBDA
	BEQ	EVLCD			;IF THEY ARE GO TO APPROPRIATE
					; PLACES
	CMP	J1,#ANLAMBDA
	BNE	EVERROR			;IF NOT (N)LAMBDA, WE HAVE AN
					; ERROR
EVNLCD:	MOV	6(SP),J1		;CODE TO EVALUAATE NLAMBDA
	CDR	J1,J1
	NPUSH	J1			;GET ARG LIST ON STACK
EVCMN:	CDR	A,B			;GET  BOUND VARS
	MOV	@2(B),A			;GET CADR(B)
	CAR	B,B
	MOV	4(SP),J1
	MOV	LTOP,4(SP)
	MOV	J1,LTOP
	CALL	STKB			;GET NAMES
	CALL	EVAL			;AND GO EVALUATE BODY
	RET
EVLCD:	MOV	A,2(SP)			;THIS IS THE LAMBDA CODE
	MOV	6(SP),B			;SAVE FUNCTION BINDING, 
	CDR	B,B			;AND GET LIST OF FORMS TO BE 
	CALL	EVALB			;EVALED AND STACKED
	MOV	2(SP),A			;NOW GET THE FUNCTION BACK
	BR	EVCMN			;AND GO TO GET THE ARGS STACKED
					; AND BODY EVALED

EVASEARCH:	CALL EATOM		;THIS GETS THE BINDING WHEN THE
					;FUNCTION CELL ISN'T AVAIL
	JMPIFTR	A,EVERROR		;LET US PREVENT LOOPS
	BR	EVFL			;GOTO  THE EVAL DISPATCH TO
					; FIGURE OUT WHAT TO DO
EVBCD:	TST	(A)			;IF OUR BCD LAM OR NLAM
	BGE	EVSBR			;IF LAM
EVFSBR:	MOV	6(SP),J1		;MUST BE NLAM
	CDR	J1,J1			;SO GET ARG
	NPUSH	J1			;STACK IT
	BR EVSCD			;AND GO TO CODE TO EXEC THE SUBR
EVSBR:	MOV	A,2(SP)			;IF SUBR,SAVE THEFNB
	MOV	6(SP),B			;GET THE ARGS
	CDR	B,B		
	CALL	EVALB			;GET THEM ON STACK
	MOV	2(SP),A			;NOW GET FUNCTION BACK
EVSCD:	MOV	4(SP),J1
	MOV	LTOP,4(SP)
	MOV	J1,LTOP
.IF	EQ,MULTISEG		
	.IFT
	JMP	4(A)			;IF ONE SEG, BR TO THE ENTRY
	.IFF
	JMP	@4(A)			;IF TWOSEG, BR TO THE ADDRES IN
					; THE BCDP
.ENDC
EVDTPR:	CAR	A,J1			;HERE IF THE FUNCTION IS A DTPR
	CMP	J1,#ALAMBDA		;CAN  WE  PICK OU NLAM OR LAM
	BEQ	EVLCD			;IF YES, USE THAT AS FUNCTION
	CMP	J1,#ANLAMBDA
	BEQ	EVNLCD
	CALL	EDTPR			;OTHERWISE ASSUME THAT THIS IS A
					; FUNCTION CALL,EVAL IT
	JMP	EVFL			;AND TRY TO USE WHAT COMES BACK